import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

public class NewMethodReference {
    /**
     * foreach方法引用这一点我不是很明白，看过源码后就理解了
     * java8开始引入函数式接口，方法可以作为参数，同时引入lambda表达式和方法引用可作为实参
     * foreach方法的形参式一个函数式接口，实参可以是lambda表达式或者方法引用，其实就是将方法作为参数（底层任然是实现了接口）
     * foreach方法实体先判断参数是否为null，然后使用增强for循环，将遍历后的对象作为参数给参数方法调用，没有返回值
     *
     * List和Set都支持foreach方法
     * 数组、List和Set都支持增强for循环
     * 数组、List和Set都支持Stream流
     *
     * default void forEach(Consumer<? super T> action) {
     *     Objects.requireNonNull(action);
     *     for (T t : this) {
     *         action.accept(t);
     *     }
     * }
     */
    public static void main(String[] args) {
        List<String> names = new ArrayList();

        names.add("Google");
        names.add("Runoob");
        names.add("Taobao");
        names.add("Baidu");
        names.add("Sina");

        names.forEach(System.out::println);


        // Optional类 ：调用方式1：显式检查
        Optional<String> optionalName = findUserNameById(2L);
        if (optionalName.isPresent()) {
            System.out.println(optionalName.get().length());
        } else {
            System.out.println("用户不存在");
        }



    }

    //Optional类是Java 8引入的一个容器类，
    // 主要用于解决NullPointerException问题。它明确表示一个值可能存在也可能不存在，强制开发者显式处理值不存在的情况
    // Optional特别适合用于方法返回值，但不建议用于字段或方法参数
    //明确语义：清楚地表示返回值可能不存在
    //强制处理：迫使调用者考虑值不存在的情况
    //减少NPE：避免意外的NullPointerException
    //函数式支持：支持map、filter等函数式操作

    public static Optional<String> findUserNameById(Long id) {
        // 模拟数据库查询
        if (id == 1) {
            return Optional.of("张三");
        } else {
            return Optional.empty(); // 用户不存在时返回空Optional
        }


    }
}


//默认方法
interface A {
    default void hello() {
        System.out.println("Hello from A");
    }
}

interface B {
    default void hello() {
        System.out.println("Hello from B");
    }
}

class C implements A, B {
    // 必须重写 hello() 方法，否则编译错误
    @Override
    public  void hello() {
        System.out.println("Hello from C");
    }
}


